/*
 * Populacao.h
 *
 *  Created on: 18/10/2012
 *      Author: vagner
 */

#ifndef POPULACAO_H_
#define POPULACAO_H_
#include "Grafo.h"
#include "Individuo.h"
#include "ParametrosManager.h"
#include <vector>

namespace computacaoNatural {

class Populacao {
private:
	int numVertices;
	int numMedianas;
	Grafo* pGrafo;
	ParametrosManager* pParametros;
	std::vector <Individuo> Individuos;
	Populacao();
public:
	Populacao(int vertices, int medianas, Grafo* g, ParametrosManager* pm);
	void avaliaFitness(void);
	void selecaoNatural(void);
	void aplicaOperadoresGeneticos();
	void calculaMelhorPiorFitness(double* melhor,int* indexMelhor, double* pior, int* indexPior);
	double calculaFitnessMedia();
	void realizaTorneio(int numParticipantes);
	//Sorteia p inteiros diferentes variando de 0 a n-1 adicionado-os na lista valoresSorteados
	void sorteia(int n, int p, std::vector<int>& valoresSorteados);
	inline bool findInVector(const std::vector<int>& Lista, int item) const;
	void crossover(Individuo& i1, Individuo& i2);
	void mutacao(Individuo& i);
	inline double funcaoProb();
	void showIndividuo(int idIndividuo);
	void show(void)const;

	virtual ~Populacao();
};

} /* namespace computacaoNatural */
#endif /* POPULACAO_H_ */
